Introdução


Atualmente, há uma enorme quantidade de dados sendo produzidos a todo instante. Para a manipulação e análise estatística desses dados é fundamental a aplicação de métodos que visem uma eficiência computacional. A Análise de Componentes Principais - PCA é uma técnica da estatística multivariada que permite que os dados sejam transformados fazendo combinações lineares das variáveis originais, considerando nesse processo a associação existente entre as variáveis. Essas combinações lineares geradas são chamadas de componentes principais. Por outro lado, a Análise de Componentes Independentes - ICA é uma técnica capaz de revelar fatores escondidos em conjuntos de sinais e define um modelo gerador para os dados observados, que são assumidos serem misturas de variáveis ocultas e desconhecidas. As variáveis latentes são assumidas mutuamente independentes, e são chamadas de componentes independentes ou fontes dos dados observados.
Neste trabalho, especificamente, serão realizadas as análises considerando três bancos de dados distintos: (1) Banco Pima; (2) Banco Parkinson e; (3) Banco Mine vs rock. Cada aba abaixo dispõe sobre a análise dos dados supracitados.


Bancos de dados

Pima

Esta base de dados contém 768 amostras, divididas em duas classes que representam a presença ou não de diabetes mellitus em mulheres:

  • Classe 0 (Não-diabéticos): 500 amostras
  • Classe 1 (Diabéticos): 268 amostras
# Leitura dos dados
pima <- read.delim("pima.txt", header=FALSE)

# Atribuição
x = pima

datatable(pima)

As classes são definidas em termos de 8 atributos numéricos e que trazem as informações:

  • [V1] Número de gestações;
  • [V2] Taxa de glicose no plasma sanguíneo após 2 horas do teste de tolerância oral de glicose;
  • [V3] Pressão sanguínea diastólica;
  • [V4] Espessura (mm) da dobra da pele do tríceps;
  • [V5] Taxa de insulina no soro sanguíneo;
  • [V6] Índice de massa corporal;
  • [V7] Tendência a ter diabetes (função de pedigree);
  • [V8] Idade.

Para a visualização gráfica entre as classes, utilizou-se os seguintes histogramas:

par(mfrow=c(2,5))
for(i in 1:8){
  y = x[x[,classe]==0, i]
  hist(y, col = 2)
  y = x[x[,classe]==1, i]
  hist(y, col = 3, add = T)
}

Conforme podemos observar nos histogramas, é evidenciado em cada variável há uma sobreposição de classes. Outro ponto identificado é de que todas as variáveis não são negativas.
Para avaliar a estrutura das variáveis, utilizou-se o gráfico de pontos bidimensional. Este gráfico tem como objetivo verificar uma possível relação linear entre os pares bivariados através de um gráfico de pontos das observações, conforme apresentado abaixo:

# Gráfico de pontos bidimensional
pairs(x[,-classe], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)


De acordo com o gráfico nota-se que não existe uma relação linear entre a maioria dos pares bivariados, tendo em vista que há uma grande sobreposição entre as classes.

1. Análise de Componentes Principais (PCA)



Inicialmente, iremos analisar a correlação entre as variáveis em estudo através da matriz de correlação e também graficamente:

# Matriz de correlação
corr_pima = round(cor(pima[,-classe]), 5)
datatable(corr_pima)
# Gráfico
corrplot(corr_pima)

Conforme podemos observar, a correlação entre as variáveis está entre baixa a moderada. Apenas alguns poucos atributos chegam quase a 55% de correlação. Visualmente é possível identificar através do gráfico que as variáveis \(V1\) e \(V8\) são as mais correlacionadas.

1.1 Selecionando duas variáveis



De forma ilustrativa optou-se por apresentar, no primeiro momento, uma redução das variáveis para ilustrar a aplicação da análise de componentes principais. Inicialmente, ao verificarmos a matriz de correlação nota-se que as variáveis \(V1\) e \(V8\) são as mais correlacionadas dentre os dados, com uma correlação correspondente a \(0,54434\). Quando retiramos somente estas variáveis do gráfico bivariado, podemos visualizá-las através do gráfico de dispersão a seguir:

# Variáveis selecionadas: V1 e V8
y = x[,c(1,8)]
plot(y,col=c(2,4)[x[,classe]],pch=19, cex=1.25)

Neste segundo momento iremos criar um modelo para as variáveis em análise \(V1\) e \(V8\):

# Variáveis selecionadas: V1 e V8
y = x[,c(1,8)]

resultado <- function(){

  # Criando o modelo
  mpca = prcomp(y);mpca

  # Desvio padrão
  s  = mpca$sdev;s

  # Variância
  v = s^2;v

  # Soma total das variâncias
  sum_var_total = sum(v);sum_var_total

  # Proporção de variâncias
  prop_var = (v/sum_var_total)*100;prop_var

  # Soma acumulada
  Sum_Acumulada = cumsum(prop_var)

  listafinal = list(Modelo=mpca, Resultados=data.frame(PC = c("PC1","PC2"),Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))

  return(listafinal)
}

resultado()
## $Modelo
## Standard deviations (1, .., p=2):
## [1] 11.910840  2.790876
## 
## Rotation (n x k) = (2 x 2):
##           PC1        PC2
## V1 -0.1630622  0.9866158
## V8 -0.9866158 -0.1630622
## 
## $Resultados
##    PC  Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1 PC1 141.868115    11.910840            94.795444           94.79544
## 2 PC2   7.788987     2.790876             5.204556          100.00000

De acordo com os resultados obtidos no modelo, o desvio padrão já revela que o primeiro é maior do que o segundo: \(11,910840 > 2,790876\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes. Também podemos observar os pesos através dos autovetores de cada variável nas componentes principais através da matriz de rotação, a qual serve para fazer a transformação dos dados originais.

A análise de componentes principais indica que a primeira componente principal corresponde a \(94,795444\)% da variabilidade total. Ou seja, \(94,795444\)% da informação dos dados está contida somente nesta variável, enquanto apenas \(5,204556\)% da informação está contida na segunda.

Para analisar a estimativa das componentes principais, temos os seguintes resultados:

# Estimativa da componente principal
mpca = prcomp(y)
y.hat = predict(mpca,y)
datatable(y.hat)

Visualmente podemos comparar através dos seguintes gráficos:

# Gráfico comparativo
par(mfrow=c(1,2))
plot(y,col=c(2,4)[x[,9]],pch=19, cex=1.25)
plot(y.hat, col=c(2,4)[x[,9]],pch=19, cex=1.25)

Desta forma, podemos concluir que para as componentes PC 1 e PC 2 não há uma correlação, ao contrário das variáveis selecionadas \(V1\) e \(V8\).

1.2 Analisando todas as variáveis

Agora, iremos analisar considerando todas as variáveis com o intuito de criar o modelo e explorar as principais informações obtidas:

# Variáveis
y = x[,-classe]

resultado <- function(){

  # Criando o modelo
  mpca = prcomp(y);mpca

  # Desvio padrão
  s  = mpca$sdev;s

  # Variância
  v = s^2;v

  # Soma total das variâncias
  sum_var_total = sum(v);sum_var_total

  # Proporção de variâncias
  prop_var = round((v/sum_var_total),8)*100;prop_var

  # Soma acumulada
  Sum_Acumulada = cumsum(prop_var)

  var = "PC"
  PC = paste(var, 1:length(y));PC

  listafinal = list(Modelo=mpca, Resultados=data.frame(PC =PC,Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))

  return(listafinal)
}

resultado()
## $Modelo
## Standard deviations (1, .., p=8):
## [1] 116.0024697  30.5411220  19.7630421  14.0777374  10.6155129   6.7697447
## [7]   2.7858049   0.3207351
## 
## Rotation (n x k) = (8 x 8):
##              PC1           PC2          PC3          PC4           PC5
## V1 -0.0020217659  0.0226488861 -0.022464900  0.049045960 -0.1516128736
## V2  0.0978115765  0.9722100405  0.143428710 -0.119830016  0.0879407680
## V3  0.0160930503  0.1419093303 -0.922467192  0.262742788  0.2321650088
## V4  0.0607566861 -0.0578614699 -0.307013055 -0.884369380 -0.2599734875
## V5  0.9931108438 -0.0946266913  0.020977302  0.065550362  0.0001723122
## V6  0.0140108085  0.0469729766 -0.132444542 -0.192801728 -0.0214744823
## V7  0.0005371679  0.0008168046 -0.000639983 -0.002699086 -0.0016408068
## V8 -0.0035647443  0.1401681812 -0.125454310  0.301024330 -0.9205049033
##             PC6           PC7           PC8
## V1  0.005047309  0.9866729948 -0.0061012325
## V2 -0.050739181  0.0008834261  0.0008254595
## V3 -0.075636552 -0.0012297595 -0.0005208655
## V4 -0.221363068 -0.0003764447  0.0025487191
## V5  0.006133265  0.0014230739  0.0002689659
## V6  0.970776708 -0.0027304621  0.0026734186
## V7  0.002029037 -0.0063440297 -0.9999721465
## V8  0.015113324 -0.1625553433  0.0019527197
## 
## $Resultados
##     PC    Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1 PC 1 13456.572981  116.0024697            88.854663           88.85466
## 2 PC 2   932.760132   30.5411220             6.159078           95.01374
## 3 PC 3   390.577831   19.7630421             2.579012           97.59275
## 4 PC 4   198.182691   14.0777374             1.308614           98.90137
## 5 PC 5   112.689115   10.6155129             0.744094           99.64546
## 6 PC 6    45.829443    6.7697447             0.302615           99.94808
## 7 PC 7     7.760709    2.7858049             0.051244           99.99932
## 8 PC 8     0.102871    0.3207351             0.000679          100.00000

De acordo com os resultados obtidos no modelo, o desvio padrão apresenta um comportamento decrescente: \(116,0024697 > 30,5411220 > 19,7630421 > 14,0777374 > 10,6155129 > 6,7697447 > 2,7858049 > 0,3207351\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes. Também podemos observar os pesos através dos autovetores de cada variável nas componentes principais através da matriz de rotação, a qual serve para fazer a transformação dos dados originais.

A análise de componentes principais indica que a primeira componente principal corresponde a \(88,85466\)% da variabilidade total. Ou seja, \(88,85466\)% da informação dos dados está contida somente nesta variável. A segunda componente acumula com a primeira \(95,01374\)% da variabilidade total. Desta forma, podemos selecionar apenas as duas primeiras componentes principais por apresentarem uma alta variabilidade. Assim, diminuímos de uma dimensão 8 para uma dimensão 2, o que implica em um aumento na eficiência computacional.

Para analisar a estimativa das componentes principais, temos os seguintes resultados:

# Estimativa da componente principal
mpca = prcomp(y)
y.hat = round(predict(mpca,y),5)
datatable(y.hat)

Visualmente podemos comparar através dos seguintes gráficos:

# Gráfico comparativo
pairs(y, col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)

pairs(y.hat, col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)

Desta forma, faz-se a redução das variáveis considerando apenas as duas primeiras componentes principais:

pairs(y.hat[,1:2], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)

A redução de dimensionalidade é uma etapa fundamental para diminuir a complexidade e aumentar a eficácia dos classificadores. Assim, de acordo com as avaliações experimentais obteve-se resultados positivos no que se refere a redução da dimensão dos dados, entretanto, no que diz respeito à separação de classes, para o problema tratado aqui, a PCA não obteve uma distinção evidente e clara das classes.



2. Análise de Componentes Independentes (ICA)



Considerando os dados deste banco como uma matriz de 768 linhas e 8 atributos numéricos, aplicaremos a ICA. Devido a grande quantidade de informações, optou-se por representar os resultados somente através de gráficos:

  • Matriz S - Matriz de estimativas do sinal de origem;

  • Matriz M - Matriz de mistura estimada;

  • Matriz W - Matriz de não-mistura estimada (inversa da matriz M);

  • Matriz Y - Matriz de dados branqueados;

  • Matriz Q - Matriz de branqueamento;

  • Matriz R - Matriz de rotação ortogonal.

par(mfrow=c(2,3))
ICA = icafast(x, nc=ncol(x))
plot(ICA$S, pch=19, cex=1.25, main="Matriz S")
plot(ICA$M, pch=19, cex=1.25,main="Matriz M")
plot(ICA$W, pch=19, cex=1.25, main="Matriz W")
plot(ICA$Y, pch=19, cex=1.25,main="Matriz Y")
plot(ICA$Q, pch=19, cex=1.25, main="Matriz Q")
plot(ICA$R, pch=19, cex=1.25,main="Matriz R")

Obtem-se as componentes independentes e sua representação gráfica será:

# ICA
y_ICA = as.matrix(x) %*% t(ICA$W)
pairs(y_ICA[,1:2], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)

Em comparação com os dados originais e os obtidos através da Análise de Componentes Principais (PCA), é possível verificar que os dados na Análise de Componentes Independentes (ICA) também permanecem sem distinção mais evidente das classes.

Parkinson

Esta base de dados contém 195 amostras, divididas em duas classes as quais é discriminado as pessoas saudáveis das que possuem a doença de parkinson, sendo:

  • Classe 1 (tem parkinson): 48 amostras
  • Classe 2 (não tem parkinson): 147 amostras
As classes são definidas em termos de 22 atributos numéricos e que trazem as informações sobre os entrevistados na pesquisa.
# Leitura dos dados
parkinson <- read.delim("parkinson.txt", header=FALSE)

# Atribuição
x = parkinson

datatable(parkinson)


Para a análise de classes univariada, podemos visualizar o comportamento das variáveis através dos seguintes histogramas:

par(mfrow=c(4,6))

for(i in 1:22){
  y = x[x[,classe]==2, i]
  hist(y, col = 2,ylim = c(0,50))
  y = x[x[,classe]==1, i]
  hist(y, col = 3, add = T)
  
}


Conforme podemos observar nos histogramas, é evidenciado em cada variável há uma sobreposição de classes. Outro ponto identificado é de que todas as variáveis não são negativas.

Para avaliar a estrutura das variáveis, utilizou-se o gráfico de correlação com o objetivo verificar uma possível relação linear entre os pares bivariados, conforme apresentado abaixo:

# Gráfico
corr_parkinson = cor(parkinson[,-classe])
corrplot(corr_parkinson)


De acordo com o gráfico podemos observar a correlação entre as variáveis apresentam uma parcela expressiva de correlações fortes na região central. Desta forma, para uma melhor visualização, elaborou-se um gráfico de pontos bidimensional entre as variáveis mais correlacionadas no centro, conforme abaixo:

# Pontos Bidimensional
pairs(x[4:16], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)

Visualmente é possível identificar através do gráfico que as variáveis \(V9\) e \(V10\), por exemplo, são altamente correlacionadas, conforme pode ser visualizado através do gráfico de dispersão destas:

# Variáveis selecionadas: V9 e V10
y = x[,c(9,10)]
plot(y,col=c(2,4)[x[,classe]],pch=19, cex=1.25)

Desta forma, é possível observar uma relação linear positiva entre as variáveis apresentadas no gráfico.

1. Análise de Componentes Principais (PCA)



Agora iremos analisar a correlação entre as variáveis em estudo através da matriz de correlação:
# Matriz de correlação
corr_parkinson = cor(parkinson[,-classe])
datatable(corr_parkinson)


Conforme podemos observar, a correlação entre as variáveis é considerada alta em parte expressiva dos pares bivariados. Alguns valores são tão próximos de 1, que um possível arredodamento nos dados poderia influenciar no resultado final.

1.1 Selecionando duas variáveis



De forma ilustrativa optou-se por apresentar, no primeiro momento, uma redução das variáveis para mostrar a aplicação da análise de componentes principais. Inicialmente, ao verificarmos a matriz de correlação e o gráfico de pontos bivariado notou-se, por exemplo, que as variáveis \(V9\) e \(V10\) são altamente correlacionadas, com uma correlação correspondente a \(0,9872578\) e, além disso, há uma distinção mais evidente entre as classes.

Portanto, neste segundo momento iremos criar um modelo para as variáveis em análise \(V9\) e \(V10\):

# Variáveis selecionadas: V9 e V10
y = x[,c(9,10)]

resultado <- function(){

  # Criando o modelo
  mpca = prcomp(y);mpca

  # Desvio padrão
  s  = mpca$sdev

  # Variância
  v = s^2

  # Soma total das variâncias
  sum_var_total = sum(v)

  # Proporção de variâncias
  prop_var = (v/sum_var_total)*100

  # Soma acumulada
  Sum_Acumulada = cumsum(prop_var)

  listafinal = list(Modelo=mpca, Resultados=data.frame(PC = c("PC1","PC2"),Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))

  return(listafinal)
}

resultado()
## $Modelo
## Standard deviations (1, .., p=2):
## [1] 0.195764704 0.002987081
## 
## Rotation (n x k) = (2 x 2):
##             PC1         PC2
## V9  -0.09511934  0.99546588
## V10 -0.99546588 -0.09511934
## 
## $Resultados
##    PC    Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1 PC1 3.832382e-02  0.195764704          99.97672316           99.97672
## 2 PC2 8.922650e-06  0.002987081           0.02327684          100.00000

De acordo com os resultados obtidos no modelo, o desvio padrão já revela que o primeiro é maior do que o segundo: \(0,195764704 > 0,002987081\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes. Também podemos observar os pesos através dos autovetores de cada variável nas componentes principais através da matriz de rotação, a qual serve para fazer a transformação dos dados originais.

A análise de componentes principais indica que a primeira componente principal corresponde a \(99,97672316\)% da variabilidade total. Ou seja, \(99,97672316\)%da informação dos dados está contida somente nesta variável, enquanto apenas \(0,02327684\)% da informação está contida na segunda.

Para analisar a estimativa das componentes principais, temos os seguintes resultados:
# Estimativa da componente principal
mpca = prcomp(y)
y.hat = predict(mpca,y)
datatable(y.hat)



Visualmente podemos comparar através dos seguintes gráficos:

# Gráfico comparativo
par(mfrow=c(1,2))
plot(y,col=c(2,4)[x[,classe]],pch=19, cex=1.25)
plot(y.hat, col=c(2,4)[x[,classe]],pch=19, cex=1.25)

Desta forma, podemos concluir que para as componentes PC 1 e PC 2 não há uma correlação, ao contrário das variáveis selecionadas \(V9\) e \(V10\), que são altamente correlacionadas.

1.2 Analisando todas as variáveis



Agora, iremos analisar considerando todas as variáveis com o intuito de criar o modelo e explorar as principais informações obtidas:

# Variáveis
y = x[,-classe]

resultado <- function(){

  # Criando o modelo
  mpca = prcomp(y)

  # Desvio padrão
  s  = mpca$sdev

  # Variância
  v = s^2

  # Soma total das variâncias
  sum_var_total = sum(v)

  # Proporção de variâncias
  prop_var = round((v/sum_var_total),8)*100

  # Soma acumulada
  Sum_Acumulada = cumsum(prop_var)

  var = "PC"
  PC = paste(var, 1:length(y))

  listafinal = list(Resultados=data.frame(PC=PC,Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))

return(listafinal)
}

resultado()
## $Resultados
##       PC    Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1   PC 1 8.747145e+03 9.352617e+01            72.899269           72.89927
## 2   PC 2 2.618706e+03 5.117329e+01            21.824461           94.72373
## 3   PC 3 6.133968e+02 2.476685e+01             5.112088           99.83582
## 4   PC 4 1.912333e+01 4.373023e+00             0.159375           99.99519
## 5   PC 5 4.798595e-01 6.927189e-01             0.003999           99.99919
## 6   PC 6 7.335045e-02 2.708329e-01             0.000611           99.99980
## 7   PC 7 1.226807e-02 1.107613e-01             0.000102           99.99990
## 8   PC 8 5.642697e-03 7.511789e-02             0.000047           99.99995
## 9   PC 9 3.173374e-03 5.633270e-02             0.000026           99.99998
## 10 PC 10 1.385912e-03 3.722783e-02             0.000012           99.99999
## 11 PC 11 5.373450e-04 2.318070e-02             0.000004           99.99999
## 12 PC 12 4.235205e-04 2.057961e-02             0.000004          100.00000
## 13 PC 13 7.081227e-05 8.415003e-03             0.000001          100.00000
## 14 PC 14 1.591830e-05 3.989775e-03             0.000000          100.00000
## 15 PC 15 7.723414e-06 2.779103e-03             0.000000          100.00000
## 16 PC 16 3.062283e-06 1.749938e-03             0.000000          100.00000
## 17 PC 17 5.035618e-07 7.096209e-04             0.000000          100.00000
## 18 PC 18 2.053431e-07 4.531480e-04             0.000000          100.00000
## 19 PC 19 5.845390e-08 2.417724e-04             0.000000          100.00000
## 20 PC 20 2.612557e-11 5.111318e-06             0.000000          100.00000
## 21 PC 21 6.535729e-12 2.556507e-06             0.000000          100.00000
## 22 PC 22 5.372718e-12 2.317912e-06             0.000000          100.00000


De acordo com os resultados obtidos no modelo, o desvio padrão apresenta um comportamento decrescente, com valor máximo de \(93,5262 > 51,1733 > 24,7668 > 4,3730 > ... > 2,317912e^{-6}\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes.

A análise de componentes principais indica que a primeira componente principal corresponde a \(72,899269\)% da variabilidade total. Ou seja, \(72,899269\)% da informação dos dados está contida somente nesta variável. A segunda componente acumula com a primeira \(94,72373\)% da variabilidade total. Desta forma, podemos selecionar apenas as duas primeiras componentes principais por apresentarem uma alta variabilidade. Assim, diminuímos de uma dimensão 22 para uma dimensão 2, o que implica em um aumento na eficiência computacional.

Para analisar a estimativa das componentes principais, temos os seguintes resultados:
# Estimativa da componente principal
mpca = prcomp(y)
y.hat = predict(mpca,y)
datatable(y.hat)



Visualmente podemos comparar através dos seguintes gráficos:

# Gráfico comparativo
corr_parkinson = cor(parkinson[,-classe])
mpca = prcomp(y)
y.hat = predict(mpca,y)
cor_y.hat = cor(y.hat)
par(mfrow=c(1,2))
corrplot(corr_parkinson)
corrplot(cor_y.hat)

Assim, podemos verificar que, de fato, não existe correlação entre as componentes principais estimadas.
Desta forma, faz-se a redução das variáveis considerando apenas as duas primeiras componentes principais:

pairs(y.hat[,1:2], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)

A redução de dimensionalidade é uma etapa fundamental para diminuir a complexidade e aumentar a eficácia dos classificadores. Assim, de acordo com as avaliações experimentais obteve-se resultados positivos no que se refere a redução da dimensão dos dados, entretanto, no que diz respeito à separação de classes, para o problema tratado aqui, a PCA não obteve uma distinção muito evidente e clara das classes.



2. Análise de Componentes Independentes (ICA)



Considerando os dados deste banco como uma matriz de 195 linhas e 22 atributos numéricos, aplicaremos a ICA. Devido a grande quantidade de informações, optou-se por representar os resultados somente através de gráficos:

  • Matriz S - Matriz de estimativas do sinal de origem;

  • Matriz M - Matriz de mistura estimada;

  • Matriz W - Matriz de não-mistura estimada (inversa da matriz M);

  • Matriz Y - Matriz de dados branqueados;

  • Matriz Q - Matriz de branqueamento;

  • Matriz R - Matriz de rotação ortogonal.

par(mfrow=c(2,3))
ICA = icafast(x, nc=ncol(x))
plot(ICA$S, pch=19, cex=1.25, main="Matriz S")
plot(ICA$M, pch=19, cex=1.25,main="Matriz M")
plot(ICA$W, pch=19, cex=1.25, main="Matriz W")
plot(ICA$Y, pch=19, cex=1.25,main="Matriz Y")
plot(ICA$Q, pch=19, cex=1.25, main="Matriz Q")
plot(ICA$R, pch=19, cex=1.25,main="Matriz R")

Obtem-se as componentes independentes e sua representação gráfica será:

# ICA
y_ICA = as.matrix(x) %*% t(ICA$W)
pairs(y_ICA[,1:2], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)

Em comparação com os dados originais e os obtidos através da Análise de Componentes Principais (PCA), é possível verificar que os dados na Análise de Componentes Independentes (ICA) também permanecem sem distinção mais evidente das classes.

Mine vs rock

Esta base de dados contém 208 amostras, divididas em duas classes discriminadas entre os sinais de sonar que ricocheteiam em um cilindro de metal e os ricocheteiam em uma rocha, sendo:

  • Classe 1 (mina - cilindro de metal): 111 amostras
  • Classe 2 (rocha): 97 amostras

As classes são definidas em termos de 60 atributos numéricos e que trazem as informações sobre os entrevistados na pesquisa.

# Leitura dos dados
mine_rock <- read.delim("mine_rock.txt", header=FALSE)

# Atribuição
x = mine_rock

datatable(mine_rock)


Para a análise de classes univariada, podemos visualizar o comportamento das variáveis através dos seguintes histogramas subdivididos em blocos para melhor visualização:

Histogramas (1-20)

par(mfrow=c(4,5))

for(i in 1:20){
  y = x[x[,classe]==2, i]
  hist(y, col = 2,ylim = c(0,50))
  y = x[x[,classe]==1, i]
  hist(y, col = 3, add = T)
 }

Histogramas (21-40)

par(mfrow=c(4,5))

for(i in 21:40){
  y = x[x[,classe]==2, i]
  hist(y, col = 2,ylim = c(0,50))
  y = x[x[,classe]==1, i]
  hist(y, col = 3, add = T)
  }

Histogramas (41-60)

par(mfrow=c(4,5))

for(i in 41:60){
  y = x[x[,classe]==2, i]
  hist(y, col = 2,ylim = c(0,50))
  y = x[x[,classe]==1, i]
  hist(y, col = 3, add = T)
  
}


Conforme podemos observar nos histogramas, é evidenciado em cada variável há uma sobreposição de classes. Outro ponto identificado é de que todas as variáveis não são negativas.

# Gráfico
corr_mine_rock = cor(mine_rock[,-classe])
corrplot(corr_mine_rock)


De acordo com o gráfico podemos observar a correlação entre as variáveis apresentam uma parcela expressiva de correlações fortes em torno da diagonal principal. Visualmente é possível identificar através do gráfico que as variáveis \(V15\) e \(V16\), por exemplo, são altamente correlacionadas, conforme pode ser visualizado através do gráfico de dispersão destas:

# Variáveis selecionadas: V15 e V16
y = x[,c(15,16)]
plot(y,col=c(2,4)[x[,classe]],pch=19, cex=1.25)

Desta forma, é possível observar uma relação linear positiva entre as variáveis apresentadas no gráfico.

1. Análise de Componentes Principais (PCA)


Agora iremos analisar a correlação entre as variáveis em estudo através da matriz de correlação:
# Matriz de correlação
corr_mine_rock = cor(mine_rock[,-classe])
datatable(corr_mine_rock)


Conforme podemos observar, a correlação entre as variáveis é em sua maioria considerada entre média a alta em parte expressiva dos pares bivariados.

1.1 Selecionando duas variáveis


De forma ilustrativa optou-se por apresentar, no primeiro momento, uma redução das variáveis para ilustrar a aplicação da análise de componentes principais. Inicialmente, ao verificarmos a matriz de correlação notou-se, por exemplo, que as variáveis \(V15\) e \(V16\) são altamente correlacionadas, com uma correlação correspondente a \(0,9126254\).

Portanto, neste segundo momento iremos criar um modelo para as variáveis em análise \(V15\) e \(V16\):

# Variáveis selecionadas: V15 e V16
y = x[,c(15,16)]

resultado <- function(){

  # Criando o modelo
  mpca = prcomp(y);mpca

  # Desvio padrão
  s  = mpca$sdev;s

  # Variância
  v = s^2;v

  # Soma total das variâncias
  sum_var_total = sum(v);sum_var_total

  # Proporção de variâncias
  prop_var = (v/sum_var_total)*100;prop_var

  # Soma acumulada
  Sum_Acumulada = cumsum(prop_var)

  listafinal = list(Modelo=mpca, Resultados=data.frame(PC = c("PC1","PC2"),Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))

  return(listafinal)
}

resultado()
## $Modelo
## Standard deviations (1, .., p=2):
## [1] 0.30362065 0.06434819
## 
## Rotation (n x k) = (2 x 2):
##           PC1        PC2
## V15 0.6574755  0.7534759
## V16 0.7534759 -0.6574755
## 
## $Resultados
##    PC  Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1 PC1 0.09218550   0.30362065            95.701388           95.70139
## 2 PC2 0.00414069   0.06434819             4.298612          100.00000

De acordo com os resultados obtidos no modelo, o desvio padrão já revela que o primeiro é maior do que o segundo: \(0,30362065 > 0,06434819\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes. Também podemos observar os pesos através dos autovetores de cada variável nas componentes principais através da matriz de rotação, a qual serve para fazer a transformação dos dados originais.

A análise de componentes principais indica que a primeira componente principal corresponde a \(95,701388\)% da variabilidade total. Ou seja, \(95,701388\)% da informação dos dados está contida somente nesta variável, enquanto apenas \(4,298612\)% da informação está contida na segunda.

Para analisar a estimativa das componentes principais, temos os seguintes resultados:

# Estimativa da componente principal
mpca = prcomp(y)
y.hat = predict(mpca,y)
datatable(y.hat)

Visualmente podemos comparar através dos seguintes gráficos:

# Gráfico comparativo
par(mfrow=c(1,2))
plot(y,col=c(2,4)[x[,classe]],pch=19, cex=1.25)
plot(y.hat, col=c(2,4)[x[,classe]],pch=19, cex=1.25)

Desta forma, podemos concluir que para as componentes PC 1 e PC 2 não há uma correlação, ao contrário das variáveis selecionadas \(V15\) e \(V16\), que são altamente correlacionadas. Outro ponto relevante diz respeito a visível sobreposição de classes.

1.2 Analisando todas as variáveis



Agora, iremos analisar considerando todas as variáveis com o intuito de criar o modelo e explorar as principais informações obtidas:

# Variáveis
y = x[,-classe]

resultado <- function(){

  # Criando o modelo
  mpca = prcomp(y)

  # Desvio padrão
  s  = mpca$sdev;s

  # Variância
  v = s^2;v

  # Soma total das variâncias
  sum_var_total = sum(v);sum_var_total

  # Proporção de variâncias
  prop_var = round((v/sum_var_total),8)*100;prop_var

  # Soma acumulada
  Sum_Acumulada = cumsum(prop_var)

  var = "PC"
  PC = paste(var, 1:length(y));PC

  listafinal = list(Resultados=data.frame(PC=PC,Variancia=v,DesvioPadrao=s,ProporcaoDaVariancia = prop_var,ProporcaoAcumulada=Sum_Acumulada))

return(listafinal)
}

resultado()
## $Resultados
##       PC    Variancia DesvioPadrao ProporcaoDaVariancia ProporcaoAcumulada
## 1   PC 1 5.588520e-01  0.747564057            31.971149           31.97115
## 2   PC 2 3.562935e-01  0.596903291            20.383060           52.35421
## 3   PC 3 1.495547e-01  0.386723086             8.555820           60.91003
## 4   PC 4 1.129082e-01  0.336018165             6.459322           67.36935
## 5   PC 5 9.026885e-02  0.300447753             5.164156           72.53351
## 6   PC 6 7.780999e-02  0.278944425             4.451402           76.98491
## 7   PC 7 7.355004e-02  0.271201105             4.207696           81.19261
## 8   PC 8 4.601845e-02  0.214519125             2.632652           83.82526
## 9   PC 9 3.898078e-02  0.197435516             2.230037           86.05529
## 10 PC 10 3.359315e-02  0.183284329             1.921817           87.97711
## 11 PC 11 2.736142e-02  0.165412877             1.565309           89.54242
## 12 PC 12 2.375992e-02  0.154142539             1.359272           90.90169
## 13 PC 13 2.045395e-02  0.143017310             1.170142           92.07183
## 14 PC 14 1.672477e-02  0.129324296             0.956801           93.02863
## 15 PC 15 1.526561e-02  0.123554089             0.873325           93.90196
## 16 PC 16 1.339824e-02  0.115750750             0.766495           94.66845
## 17 PC 17 1.257574e-02  0.112141594             0.719440           95.38790
## 18 PC 18 9.886534e-03  0.099431051             0.565595           95.95349
## 19 PC 19 9.217387e-03  0.096007224             0.527314           96.48080
## 20 PC 20 8.532273e-03  0.092370305             0.488120           96.96892
## 21 PC 21 6.395960e-03  0.079974746             0.365904           97.33483
## 22 PC 22 5.128546e-03  0.071613870             0.293397           97.62823
## 23 PC 23 4.683146e-03  0.068433516             0.267916           97.89614
## 24 PC 24 4.195055e-03  0.064769247             0.239993           98.13613
## 25 PC 25 4.056054e-03  0.063687158             0.232041           98.36817
## 26 PC 26 3.773819e-03  0.061431420             0.215895           98.58407
## 27 PC 27 2.733375e-03  0.052281690             0.156373           98.74044
## 28 PC 28 2.455871e-03  0.049556748             0.140497           98.88094
## 29 PC 29 2.268432e-03  0.047628055             0.129774           99.01071
## 30 PC 30 2.069714e-03  0.045494115             0.118405           99.12912
## 31 PC 31 1.690653e-03  0.041117555             0.096720           99.22584
## 32 PC 32 1.589436e-03  0.039867729             0.090929           99.31677
## 33 PC 33 1.330604e-03  0.036477448             0.076122           99.39289
## 34 PC 34 1.265016e-03  0.035567066             0.072370           99.46526
## 35 PC 35 1.223605e-03  0.034980063             0.070001           99.53526
## 36 PC 36 1.138808e-03  0.033746234             0.065150           99.60041
## 37 PC 37 9.576650e-04  0.030946162             0.054787           99.65520
## 38 PC 38 9.181038e-04  0.030300228             0.052523           99.70772
## 39 PC 39 8.521980e-04  0.029192430             0.048753           99.75647
## 40 PC 40 7.065658e-04  0.026581306             0.040422           99.79690
## 41 PC 41 6.895917e-04  0.026260079             0.039451           99.83635
## 42 PC 42 6.344712e-04  0.025188711             0.036297           99.87264
## 43 PC 43 4.806888e-04  0.021924615             0.027500           99.90014
## 44 PC 44 4.080856e-04  0.020201129             0.023346           99.92349
## 45 PC 45 3.365843e-04  0.018346234             0.019256           99.94275
## 46 PC 46 2.597476e-04  0.016116686             0.014860           99.95761
## 47 PC 47 1.601862e-04  0.012656470             0.009164           99.96677
## 48 PC 48 1.375515e-04  0.011728235             0.007869           99.97464
## 49 PC 49 1.241934e-04  0.011144207             0.007105           99.98174
## 50 PC 50 8.051009e-05  0.008972741             0.004606           99.98635
## 51 PC 51 5.559273e-05  0.007456053             0.003180           99.98953
## 52 PC 52 4.340291e-05  0.006588088             0.002483           99.99201
## 53 PC 53 3.244466e-05  0.005696021             0.001856           99.99387
## 54 PC 54 2.644564e-05  0.005142533             0.001513           99.99538
## 55 PC 55 2.145421e-05  0.004631869             0.001227           99.99661
## 56 PC 56 1.862001e-05  0.004315091             0.001065           99.99767
## 57 PC 57 1.371542e-05  0.003703433             0.000785           99.99846
## 58 PC 58 1.180285e-05  0.003435528             0.000675           99.99913
## 59 PC 59 9.359878e-06  0.003059392             0.000535           99.99967
## 60 PC 60 5.807808e-06  0.002409939             0.000332          100.00000

De acordo com os resultados obtidos no modelo, o desvio padrão apresenta um comportamento decrescente, com valor máximo de \(0,747564057 > 0,596903291 > 0,386723086 > ... > 0,002409939\), logo, confirmamos a relação de que na análise de componentes principais as variâncias são decrescentes.

A análise de componentes principais indica que a primeira componente principal corresponde a \(31,971149\)% da variabilidade total. Ou seja, \(31,971149\)% da informação dos dados está contida somente nesta variável. A segunda componente acumula com a primeira \(52,35421\)% da variabilidade total. Desta forma, analisando as informações obtidas, podemos selecionar as 12 primeiras componentes principais por apresentarem uma alta variabilidade. Assim, diminuímos de uma dimensão 60 para uma dimensão 12, o que implica em um aumento na eficiência computacional.

Para analisar a estimativa das componentes principais, temos os seguintes resultados:
# Estimativa da componente principal
mpca = prcomp(y)
y.hat = predict(mpca,y)
datatable(y.hat)



Se formos analisar a correlação das estimativas, estas podem ser verificadas através do seguinte gráfico:

cor_y.hat = cor(y.hat)
corrplot(cor_y.hat)

Assim, podemos verificar que, de fato, não existe correlação entre as componentes principais estimadas.

Desta forma, faz-se a redução das variáveis considerando apenas as 12 primeiras componentes principais:

pairs(y.hat[,1:12], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)

A redução de dimensionalidade é uma etapa fundamental para diminuir a complexidade e aumentar a eficácia dos classificadores. Assim, de acordo com as avaliações experimentais obteve-se resultados positivos no que se refere a redução da dimensão dos dados, entretanto, no que diz respeito à separação de classes, para o problema tratado aqui, a PCA não obteve uma distinção muito evidente e clara das classes.



2. Análise de Componentes Independentes (ICA)



Considerando os dados deste banco como uma matriz de 208 linhas e 60 atributos numéricos, aplicaremos a ICA. Devido a grande quantidade de informações, optou-se por representar os resultados somente através de gráficos:

  • Matriz S - Matriz de estimativas do sinal de origem;

  • Matriz M - Matriz de mistura estimada;

  • Matriz W - Matriz de não-mistura estimada (inversa da matriz M);

  • Matriz Y - Matriz de dados branqueados;

  • Matriz Q - Matriz de branqueamento;

  • Matriz R - Matriz de rotação ortogonal.

par(mfrow=c(2,3))
ICA = icafast(x, nc=ncol(x))
plot(ICA$S, pch=19, cex=1.25, main="Matriz S")
plot(ICA$M, pch=19, cex=1.25,main="Matriz M")
plot(ICA$W, pch=19, cex=1.25, main="Matriz W")
plot(ICA$Y, pch=19, cex=1.25,main="Matriz Y")
plot(ICA$Q, pch=19, cex=1.25, main="Matriz Q")
plot(ICA$R, pch=19, cex=1.25,main="Matriz R")

Obtem-se as componentes independentes e sua representação gráfica será:

# ICA
y_ICA = as.matrix(x) %*% t(ICA$W)
pairs(y_ICA[,1:12], col = c(2,4)[as.numeric(x[,classe])], pch=19, cex=1.25)

Em comparação com os dados originais e os obtidos através da Análise de Componentes Principais (PCA), é possível verificar que os dados na Análise de Componentes Independentes (ICA) estão geometricamente um pouco mais separados e com uma distinção mais evidente das classes (embora ainda ocorra a sobreposição).